package com.season.seasonStudy.javase.j_007_string;
/**
 * 字符串
 * 比较重要的:
 * 		String
 * 		StringBuffer
 * 		StringBuilder
 * 
 */

/**
 * 
 * 对字符串的处理：String  a;
 * 
 * 	1.看长度：int strLength=a.length();
 * 	2.拼接：String newStr =	a+串2，
 * 							a.concat (串2);
 * 	3.转化(大小写):	a.toUpperCase();
 * 					a.toLowerCase();
 * 	4.判断值相等:	a.equals(串2);
 * 					a.equalsIgnoreCase();
 * 	5.看下标或字符:	int  index = a.indexOf(String);
 * 					int  index = a.indexOf(String,int begin);//从begin开始查String的index
 * 								 a.lastIndexOf(String);
 * 								 a.lastIndexOf(String,int begin); 
 * 	6.查字符串:	String newStr = a.substring(int begin);
 * 				String newStr = a.substring(int begin,int end);
 * 	7.拆分字符串:	String [] b=new String[100];
 * 					b = a.split("以该字符拆分");	//其实里面放的是正则表达式
 * 		拆分的字符会被删除
 * 		返回值:新字符串数组
 * 	8.去空格： String  newStr= a.trim();
 * 
 * 	9.StringBuffer类：String 的增强类；
 * 		StringBuffer sb = new StringBuffer(字符串);
 * 			插入：sb.insert(int begin , 串2 )；
 * 			拼接：sb.append(串2)；
 * 
 * 10.String类型与StringBuffer类型互转：
 * 例如：String  a与StringBuffer  sb互转
 * 		--------其实也不复杂,一个是所有对象的toString();	还有就是StringBuffer的构造方法
 * 		a=sb.toString();		//将sb转成String类
 * 		sb=new StringBuffer(a);	//将String类转成StringBuffer类
 */

/**
 * 字符串：
 * 	1.字符串一旦创建不再改变，“abc”字符串对象一旦创建不可再改成“abcd”
 * 	2.提升字符串的访问效率：在程序中使用了“缓存”技术。
 * 所以在java中所以使用双引号括起来的字符串都会在“字符串常量池”中创建一份。
 * 字符串常量池在方法去中被存储。
 * 	3.在程序执行过程中，如果程序会用到某个字符串，例如“abc”，
 * 那么程序会在字符串常量池中去搜索该字符串，
 * 如果没有找到则在字符串常量池中新建一个“abc”字符串，如果找到就直接拿过来用。
 * （字符串常量池是一个缓存区，为了提高字符串的效率）
 * 
 * 例：
 * String s1=”abc”;只会在字符串常量池中创建一个”abc”对象。
 * String s2=new String(“abc”);先去字符串常量池中查找有没有”abc”，有的话就不创建，没有就创建，并且会在堆中在创建一个字符串对象(创建2次)
 * 第二种方式比较浪费内存，常用第一种方式。
 * 例：String s1=new String(“hello”)
 * String s2=new String(“Hello”)
 * 判断以上程序会创建几个对象？
 * 总共3个。堆中2个，方法区字符串常量池1个
 * 注意：尽量不要做字符串频繁的拼接操作。因为字符串一旦创建不可改变，只要频繁拼接，就会在字符串常量池中创建大量的字符串对象，给垃圾回收带来问题。
 * 字符串常用方法：
 * 1.	char charAt(int index)//查找索引所对应的值
 * 2.	boolean endsWith(String endstr)//返回字符串是否以某个字符串结尾
 * 3.	equalsIgnoreCase(String anothorString)//忽略大小写判断是否相等
 * 4.	byte[] getBytes()//把字符串存到byte数组中 byte[] bytes=”abc”.getBytes();
 * 5.	int indexof()//返回在字符串中第一次出现的索引（形参有多种形式，可参见API）
 * 6.	int lastIndexOf(string str)// 返回在字符串中最后一次出现的索引
 * 7.	int length();//返回此字符串的长度，数组是length属性，String是length()方法
 * 8.	String replaceAll(String s1.String s2);//把字符串中s1替换成s2,此方法是4个字符串（调用方法的字符串，s1,s2,最后生成的字符串）
 * 9.	String[] split(String s)//根据s分割，生成字符串数组
 * 初步正则表达式(以^开始$结束)
 * 1.	是一门独立的学科，是一种字符模型，专门做字符串格式匹配的。
 * 2.	正则表达式是通用的。
 * 例如：”^a(2)$”表示2个a字符等同于”aa”
 * \d数字\D非数字\w英文字母\W非英文字母
 * StringBuffer(字符串缓冲区)
 * 工作原理：预先在内存中申请一块空间，以容纳字符序列，如果预留的空间不够用，则进行自动扩容，以容纳更多字符序列
 * 1、StringBuffer,StringBuilder和String最大区别？
 * String是一个不可变的字符序列，存储字符串常量池中。
 * StringBuffer底层是一个char数组，但是该char数组是可变的，并且可以自动扩容。StringBuffer是线程安全的(可以在多线程的环境下使用不会出现问题)。
 * StringBuilder是非线程安全的(在多线程环境下使用可能出现问题)。
 * StringBuffer和StringBuilder的默认初始化容量是16
 * 2.如何优化StringBuffer和StringBuilder？
 * 最好在创建StringBuffer之前，预测StringBuffer的存储字符数量，然后在创建StringBuffer的时候采用指定初始化容量的方式创建StringBuffer。为了减少底层数组的拷贝，提高效率。
 * 推荐字符串频繁拼接使用StringBuffer或者StringBuilder
 * StringBuffer中常用的方法：
 * StringBuffer append()  //字符串追加
 */
public class StringDemo {

}
